﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace YouDaoNotesCodes
{
    /// <summary>
    /// ref、out、paras方法参数总结
    /// </summary>
    class CSharpMethodPara
    {
        public void Start()
        {
            //outSum没必要赋值，赋值了也完全没用。
            //如果AddByOut函数内部直接使用out对应的参数，会报错：使用了未被赋值的 out 参数a
            int outSum = 1;
            int ov1 = 2;
            int ov2 = 3;
            AddByOut(out outSum, ov1, ov2);
            Console.WriteLine("outSum : " + outSum + "  v1: " + ov1 + "   v2: " + ov2);


            //refSum 必须赋值
            int refSum = 1;
            int rv1 = 2;
            int rv2 = 3;
            //如果refSum没有赋值，这里会报错：使用了未赋值的局部变量 refSum
            AddByRef(ref refSum, rv1, rv2);
            Console.WriteLine("refSum : " + refSum + "  v1: " + rv1 + "   v2: " + rv2);

            //param参数
            ParamsTest("gnplums", 12, 14, 154, 67);
        }

        public void AddByOut(out int a, int b, int c)
        {
            //a = a + b + c;// a 未被赋值，不能直接使用，即使是调用的地方 out对应的参数初始化也没用
            a = b + c;
        }

        public void AddByRef(ref int a, int b, int c)
        {
            a = a + b + c; // 可以直接使用a 
        }

        //param方法参数
        public static void ParamsTest(string name, params int[] scores)
        {
            //如果你知道此数组第几个元素代表什么。可以直接使用！
            //方法体中需要传入很多参数的，① 初始化的类变量 ② 数组或者params（类型一致） ③改为Json或者Xml这样
            // Console.WriteLine(scores[0]]);
            int sum = 0;
            for (int i = 0; i < scores.Length; i++)
            {
                sum += scores[i];
            }
            Console.WriteLine("{0}这次的总成绩是{1}", name, sum);
        }
    }
}
